home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / forth / doc / tracer.doc < prev   
Encoding:
Text File  |  1994-09-22  |  13.3 KB  |  311 lines

  1. 0660000020266
  2. 1
  3. 2Seite #
  4. 9[.........................................................]
  5. Seite54TracerundDecompiler
  6.  
  7. DasKapitel'7.2)DerTracer'vonSeite54istdurchfolgendeszu
  8. ersetzen:
  9.  
  10. Angenommen,SiewollenfolgendesWortaufFehleruntersuchen:
  11. (bittetippenSieein,allenötigenEingabensindüfettÇundalle
  12. AusgabendesvolksFORTH83sindêunterstrichenÇdargestellt.)
  13.  
  14. ü:-trailingÇ(addr1n1--addr1n2)êcompiling
  15. ü2dupbounds?DO2dup+1-c@bl=êcompiling
  16. üIFLEAVETHEN1-LOOP;êok
  17. Ç
  18. DieFunktiondiesesWorteskönnenSie,wennsieIhnenunklarist,
  19. demGlossarentnehmen.ZumTestendesWorteswirdeinString
  20. benötigt.Siedefinieren:
  21.  
  22. üCreateteststring,"DiesisteinTest        "êok
  23. Ç
  24. wobeiSiebitteabsichtlicheinigezusätzlicheLeerzeichen
  25. eingefügthaben.Siegebennunein:
  26.  
  27. üteststringcount.sê167E39ok
  28. ü-trailing.sê167E39ok
  29. Ç
  30. undstellenzuIhremErstaunenfest,daß-TRAILINGkeineinziges
  31. Leerzeichenabgeschnittenhat.(SpätestensjetztsolltenSieam
  32. RechnersitzenunddenTracerladen,wennernochnichtimSystem
  33. vorhandenist.PrüfenSie,obesdasWortDEBUGimFORTH
  34. Vocabularygibt,dannistderTracervorhanden.DerTracergehört
  35. zudensogenanntenTools.DieQuelltextefindenSieaufIhrer
  36. Diskette(SehenSiebitteimDirectorynach)).
  37.  
  38. MitdemTracerkönnenSieWorte,diemitdem:definiertwurden,
  39. imEinzelschrittbetriebtesten.UmdenTracerzubenutzen,geben
  40. Siefolgendesein:
  41.  
  42. üdebug<name1>êok
  43. Ç
  44. Hierbeiist<name1>daszutracendeWort.Zunächstgeschiehtnoch
  45. garnichts.DEBUGhatnurdenTracer"scharfgemacht".GebenSie
  46. nuneineSequenzein,die<name1>enthält,unterbrichtderTracer
  47. dieAusführung,wennerauf<name1>stößt.Eserscheintfolgendes
  48. Bild.
  49.  
  50. êaddr1addr2<name2>                (Werte)
  51. Ç
  52. ♪⑤Hierbeiistaddr1eineAdresseimParameterfeldvon<name1>,
  53. nämlichdie,inderaddr2steht.addr2istdieKompilations-
  54. Adressevon<name2>.<name2>istdasWort,dasalsnächstes
  55. ausgeführtwerdensoll.(Werte)sinddieWerte,diegeradeaufdem
  56. Stackliegen.
  57.  
  58. ♪±BleibenwirbeiunseremBeispiel,Siegebenein:
  59.  
  60. üdebug-trailingêok
  61. Ç
  62. Esgeschiehtzunächstnichts.
  63.  
  64. NunversuchenSieeswiedermitderSequenz
  65.  
  66. üteststringcount.sê167E39ok
  67. ü-trailing
  68. Ç
  69. underhaltenfolgendesBild:
  70.  
  71. ê7E045362DUP                    167E39
  72. Ç
  73. ♪③167E39istderStackinhalt,wieervonTESTSTRINGCOUNT
  74. geliefertwurde,nämlichAdresseundLängedesStrings
  75. TESTSTRING .
  76.  
  77. NatürlichkönnendieZahlenbeiIhnenandersaussehen,jenachdem,
  78. wohinTESTSTRINGund -TRAILING kompiliertwurde.536istdie
  79. Kompilations-Adressevon2DUP,7E04diePositionvon2DUPin
  80. -TRAILING.(AuchdieseAdressenkönnnensichgeänderthaben!)
  81.  
  82. DrückenSiejetztsolange<Return>,bisOKausgegebenwird.Es
  83. ergibtsichfolgendeGesamtausgabe:
  84.  
  85. üdebug-trailingteststringcount.sê167E39ok
  86. ü-trailing
  87. ê7E045362DUP                    167E39 
  88. 7E06954BOUNDS                  167E39167E39 
  89. 7E0892C(?DO                    7E397E4F167E39 
  90. 7E0C5362DUP                    167E39 
  91. 7E0E546+                       167E39167E39 
  92. 7E1064C1-                      7E4F167E39 
  93. 7E1234EC@                      7E4E167E39 
  94. 7E14215CBL                      20167E39 
  95. 7E16816=                       2020167E39 
  96. 7E18A0C?BRANCH                 FFFF167E39 
  97. 7E1CBE2LEAVE                   167E39
  98. 7E242F4  UNNEST                  167E39ok
  99. Ç
  100. SehenwirunsdieAusgabenunetwasgenaueran.Beidenersten
  101. beidenZeilenwächstderWertganzlinksimmerum2.Esistder
  102. InhaltdesInstructionpointers(IP),derimmeraufdienächste
  103. auszuführendeAdressezeigt.DerInhaltdieserAdresseistjeweils
  104. eineKompilations-Adresse( 536bei2DUPusw.).JedeKompilations-
  105. AdressebenötigtzweiBytes,dahermußderIPimmerum2erhöht
  106. werden.
  107.  
  108. ♪Immer?Nein,dennschondienächsteZeilezeigteineAusnahme.Das
  109. Wort(?DOerhöhtdenIPum4!Woherkommteigentlich(?DO ,in
  110. derDefinitionvon-TRAILINGstanddochnur?DO.(?DOistein
  111. von?DOkompiliertesWort,daszusätzlichzurKompilations-
  112. Adressenocheinen16-Bit-Wertbenötigt,nämlichfürden
  113. SprungoffsethinterLOOP,wenndieSchleifebeendetist.Zwei
  114. ähnlicheFälletretennochauf.DasIFausdemQuelltexthatein
  115. ?BRANCHkompiliert.Eswirdgesprungen,wennderoberste
  116. StackwertFALSE( =0)ist.Auch?BRANCHbenötigteinen
  117. zusätzlichen16-Bit-WertfürdenSprungoffset.
  118.  
  119. ♪·NachLEAVEgehteshinterLOOPweiter,eswirdUNNEST
  120. ausgeführt,dasvom ; in-TRAILINGkompiliertwurdeunddas
  121. gleichewieEXITbewirkt,unddamitistdasWort-TRAILINGauch
  122. beendet.DashiergelisteteWortUNNESTistnichtzuverwechseln
  123. mitdemUNNESTdesTracers(sieheunten).
  124.  
  125. WoliegtnunderFehlerinunsererDefinitionvon-TRAILING?
  126. BevorSieweiterlesen,solltenSiedieFehlerbeschreibung,den
  127. TracelaufundIhreVorstellungvonderkorrektenArbeitsweisedes
  128. WortesnocheinmalunterdieLupenehmen.
  129.  
  130. DerStackistvorundnach-TRAILINGgleichgeblieben,dieLänge
  131. desStringsalsonichtverändertworden.Offensichtlichwirddie
  132. SchleifegleichbeimerstenMalverlassen,obwohldasletzte
  133. ZeichendesTexteseinLeerzeichenwar.DieSchleifehättealso
  134. eigentlichmitdemvorletztenZeichenweitermachenmüssen.Mit
  135. anderenWorten:
  136.  
  137. DieAbbruchbedingunginderSchleifeistfalsch.Sieistgenau
  138. verkehrtherumgewählt.Ersetztman=durch= NOT oder-,so
  139. funktioniertdasWortkorrekt.ÜberlegenSiebitte,warum-
  140. statt= NOT eingesetztwerdenkann.(Tip:derIF-Zweigwird
  141. nichtausgeführt,wennderobersteStackwertFALSE(also=0)
  142. ist.)
  143.  
  144.  
  145. DervolksFORTH83-Tracergestattetes,jederzeitBefehle
  146. einzugeben,dievordemAbarbeitendesnächstenTrace-Kommandos
  147. ausgeführtwerden.Damitkannmanz.B.Stack-Werteverändernoder
  148. dasTracenabbrechen.ÄndernSieprobehalberbeimnächstenTrace-
  149. Laufvon-TRAILINGdasTRUE-Flag($FFFF)aufdemStackvorder
  150. Ausführungvon?BRANCHdurchEingabevonNOT auf0undverfolgen
  151. SiedenweiterenTrace-Lauf.Siewerdenbemerken,daßdieLOOPein
  152. zweitesMaldurchlaufenwird.
  153.  
  154. WollenSiedasTracenunddieweitereAusführungdesgetraceten
  155. Wortesabbrechen,sogebenSiebitteRESTARTein.RESTARTführt
  156. einenWarm-StartdesFORTH-SystemsausundschaltetdenTracerab.
  157. RESTARTistauchdieNotbremse,wennmandieKatastrophevorAugen
  158. hat,weilmansieht,daßdasSystemmitdemnächstenBefehl
  159. zwangsläufigimComputer-Nirwanaentschwindenwird.
  160.  
  161. ♪⑥NützlichistauchdieMöglichkeit,dasWort,dasalsnächsteszur
  162. Ausführungansteht,solangezutracen,bisesinsaufrufendeWort
  163. zurückkehrt.DafüristdasWortNESTvorgesehen.WollenSiealso
  164. wissen,wasBOUNDSmacht,sogebenSiebitte,wennBOUNDSals
  165. nächstesauszuführendesWortangezeigtwird,NESTeinundSie
  166. erhaltendann:
  167.  
  168. ê7E045362DUP                    167E39 
  169. 7E06954BOUNDS                  167E39167E39  ünest
  170. ê  95644COVER                   167E39167E39  
  171. 958546+                      7E39167E39167E39  
  172.   95A40ASWAP                   7E4F7E39167E39  
  173.   95C  2F4  UNNEST                 7E397E4F167E39
  174. 7E0892C(?DO                    7E397E4F167E39  
  175. Ç...
  176.  
  177. BeachtenSiebitte,daßdieZeilenjetzteingerücktdargestellt
  178. werden,bisderTracerautomatischindasaufrufendeWort
  179. zurückkehrt.DerGebrauchvonNESTistnurdadurcheingeschränkt,
  180. daßsicheinigeWorte,diedenReturn-Stackmanipulieren,mitNEST
  181. nichttracenlassen,daderTracerselbstGebrauchvomReturn-
  182. Stackmacht.AufsolcheWortemußmandenTracermitDEBUG
  183. ansetzen.
  184.  
  185. WollenSiedasTraceneinesWortesbeenden,ohnedieAusführung
  186. desWortesabzubrechen,sobenutzenSiebitteUNNEST.(Istder
  187. Tracergeladen,sokommenSieandastiefimSystemsteckende
  188. UNNEST,einemSynonymfürEXIT,dasausschließlichvom ; 
  189. kompiliertwird,nichtmehrheranundbenutzenstattdessendas
  190. Tracer-UNNEST,dasSieeineEbeneimTrace-Laufzurückbringt.)
  191.  
  192. ManchmalhatmanineinemWortvorkommendeSchleifenbeimersten
  193. Durchlaufalskorrekterkanntundmöchtediesenichtweiter
  194. tracen.DaskannsowohlbeiDO...LOOPsderFallseinalsauchbei
  195. KonstruktionenmitBEGIN...WHILE...REPEAToderBEGIN...UNTIL.In
  196. diesenFällengibtmanamEndederSchleifedasWortüENDLOOPÇein.
  197. DieSchleifewirddanninEchtzeitabgearbeitet.
  198.  
  199. HabenSiedenFehlergefundenundwollendeshalbnichtmehr
  200. tracen,somüssenSienachdemEndedesTracensEND-TRACEoder
  201. jederzeitRESTARTeingeben,ansonstenbleibtderTracer"scharf",
  202. waszumerkwürdigenErscheinungenführenkann;außerdemverringert
  203. sichbeieingeschaltetemTracerdieLaufzeitdesSystems.
  204.  
  205. ♪⑨DerTracerläßtsichauchmitdemWortTRACE'starten,das
  206. seinerseitseinzutracendesForth-Worterwartet.Siekönntenalso
  207. auchimobigenBeispieleingeben:
  208.  
  209. üteststringcounttrace'-trailingÇ
  210.  
  211. undhättendamitdieselbeWirkungerzielt.TRACE'schaltetaberim
  212. GegensatzzuDEBUGnachDurchlaufdesWortesdenTracer
  213. automatischmitEND-TRACEwiederab.
  214.  
  215. ♪⑤BeachtenSiebitteauch,daßdieWorteDEBUGundTRACE'das
  216. VokabularTOOLSmitindieSuchreihenfolgeaufnehmen.Siesollten
  217. alsonach-hoffentlicherfolgreichem-TracelaufdieSuchordnung
  218. wiederumschalten.
  219.  
  220. Wennmansicheingearbeitethat,istderTracereinwirklich
  221. verblüffendesWerkzeug,mitdemmansehrvieleFehlerschnell
  222. findenkann.EristgleichsameinMikroskop,mitdemmansehrtief
  223. insInnerevonForthschauenkann.
  224.  
  225.  
  226.  
  227. üDerDecompilerÇ
  228.  
  229. EinDecompilergehörtsozusagenzumgutenToneinesFORTH-
  230. Systems,warerbisherdochdieeinzigeMöglichkeit,wenigstens
  231. ungefährdenAufbaueinesSystemszudurchschauen.BeivolksFORTH-
  232. 83istdasanders,undzwarauszweiGründen:
  233.  
  234. -SiehabensämtlicheQuelltextevorliegen,undesgibtdie
  235. VIEW-Funktion.Letztereistnormalerweisesinnvolleralsder
  236. besteDecompiler,dakeinDecompilerinderLageist,z.B.
  237. Stackkommentarezurekonstruieren.
  238.  
  239. -DerTraceristbeimDebuggingsehrvielhilfreicheralsein
  240. Decompiler,daerauchdieVerarbeitungvonStackwerten
  241. erkennenläßt.DamitsindFehlerleichtaufzufinden.
  242.  
  243. DennochgibtesnatürlichauchimvolksFORTHeinenDecompiler,
  244. allerdingsineinfacher,vonHandzubedienender,Form.Er
  245. befindetsich,wiederTracer,imVocabularyTOOLS.FolgendeWorte
  246. stehenzurVerfügung.
  247.  
  248. N(name)(addr--addr')
  249. drucktdenNamendesbeiaddrkompiliertenWortesausund
  250. setztaddraufdasnächsteWort.
  251.  
  252. K(konstante)(addr--addr')
  253. wirdnachLITbenutztunddrucktdenInhaltvonaddralsZahl
  254. aus.Eswirdalsonichtversucht,denInhalt,wiebeiN,als
  255. Forthwortzuinterpretieren.
  256.  
  257. S(string)(addr--addr')
  258. wirdnach(ABORT"("(."undallenanderenWortenbenutzt,
  259. aufdieeinStringfolgt.DerStringwirdausgedrucktund
  260. addrentsprechenderhöht,sodaßsiehinterdenStringzeigt.
  261.  
  262. C(character)(addr--addr')
  263. drucktdenInhaltvonaddralsAscii-Zeichenausundgehtein
  264. Byteweiter.DamitkannmaneigeneDatenstrukturenansehen.
  265.  
  266. B(branch)(addr--addr')
  267. wirdnachBRANCHoder?BRANCHbenutztunddrucktdenInhalt
  268. einerAdressealsSprungoffsetundSprungzielaus.
  269.  
  270. D(dump)(addrn--addr')
  271. DumpednBytes.Wirdbenutzt,umselbstdefinierte
  272. Datenstrukturenanzusehen.(s.a.DUMPundLDUMP)
  273.  
  274. SehenwirunsnuneinBeispielzurBenutzungdesDecompilersan.
  275. GebenSiebittefolgendeDefinitionein:
  276.  
  277. :test(n--)
  278. 12=IFcr."DieZahlistzwölf!"THEN;
  279.  
  280. RufenSiedasVocabularyTOOLS-durchNennenseinesNamensauf
  281. undermittelnSiedieAdressedesersteninTESTkompilierten
  282. Wortes:
  283.  
  284. 'test>body
  285.  
  286. JetztkönnenSieTESTnachfolgendemMusterdecompilieren
  287. (UnterstrichensindIhreEingaben.)
  288.  
  289. ênÇA988:B54LITok
  290. êkÇA98A:12ok
  291. ênÇA98C:C52=ok
  292. ênÇA98E:E74?BRANCHok
  293. êbÇA990:1AA9AAok
  294. ênÇA992:32BCCRok
  295. ênÇA994:1776(."ok
  296. êsÇA996:12DieZahlistzwölfok
  297. ênÇA99A:416UNNEST
  298. êdropÇ
  299.  
  300. DieersteAdresseistdie,anderimWortTESTdieanderenWorte
  301. kompiliertsind.DiezweiteistjeweilsdieKompilationsadresse
  302. derWorte,danchfolgendiesonstigenAusgabendesDecompilers.
  303.  
  304. ProbierenSiediesesBeispielauchmitdemTraceraus:
  305.  
  306. 20trace'test
  307.  
  308. undachtenSieaufdieUnterschiede.Siewerdensehen,daßder
  309. Traceraussagefähigerunddazunocheinfacherzubedienenist.
  310.  
  311.